/*
 * MultiButton库基础示例
 * 本示例演示了优化后的MultiButton库的基本用法
 */

#include "multi_button.h"
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

// 按键实例
static Button btn1, btn2;
static volatile int running = 1;

// 用于演示的GPIO状态模拟
static int btn1_state = 0;
static int btn2_state = 0;

// 信号处理函数，实现优雅退出
void signal_handler(int sig)
{
    if (sig == SIGINT) {
        printf("\n收到SIGINT信号，程序退出...\n");
        running = 0;
    }
}

// 硬件抽象层函数，支持四个按钮
uint8_t read_button_gpio(uint8_t button_id)
{
    switch (button_id) {
        case 1:
            return (HAL_GPIO_ReadPin(KEY_1_GPIO_Port, KEY_1_Pin) == GPIO_PIN_SET) ? 1 : 0;
        case 2:
            return (HAL_GPIO_ReadPin(KEY_2_GPIO_Port, KEY_2_Pin) == GPIO_PIN_SET) ? 1 : 0;
        case 3:
            return (HAL_GPIO_ReadPin(KEY_3_GPIO_Port, KEY_3_Pin) == GPIO_PIN_SET) ? 1 : 0;
        case 4:
            return (HAL_GPIO_ReadPin(KEY_4_GPIO_Port, KEY_4_Pin) == GPIO_PIN_SET) ? 1 : 0;
        default:
            return 0;
    }
}

// 按键1的回调函数
void btn1_single_click_handler(Button* btn)
{
    (void)btn;  // 消除未使用参数警告
    printf("🔘 按键1：单击\n");
}

void btn1_double_click_handler(Button* btn)
{
    (void)btn;
    printf("🔘🔘 按键1：双击\n");
}

void btn1_long_press_start_handler(Button* btn)
{
    (void)btn;
    printf("⏹️ 按键1：长按开始\n");
}

void btn1_long_press_hold_handler(Button* btn)
{
    (void)btn;
    printf("⏸️ 按键1：长按保持中...\n");
}

void btn1_press_repeat_handler(Button* btn)
{
    printf("🔄 按键1：连发（计数：%d）\n", button_get_repeat_count(btn));
}

// 按键2的回调函数
void btn2_single_click_handler(Button* btn)
{
    (void)btn;
    printf("🔵 按键2：单击\n");
}

void btn2_double_click_handler(Button* btn)
{
    (void)btn;
    printf("🔵🔵 按键2：双击\n");
}

void btn2_press_down_handler(Button* btn)
{
    (void)btn;
    printf("⬇️ 按键2：按下\n");
}

void btn2_press_up_handler(Button* btn)
{
    (void)btn;
    printf("⬆️ 按键2：松开\n");
}

// 按键初始化
void buttons_init(void)
{
    // 初始化按键1（模拟为高电平有效）
    button_init(&btn1, read_button_gpio, 1, 1);

    // 绑定按键1的事件处理函数
    button_attach(&btn1, BTN_SINGLE_CLICK, btn1_single_click_handler);
    button_attach(&btn1, BTN_DOUBLE_CLICK, btn1_double_click_handler);
    button_attach(&btn1, BTN_LONG_PRESS_START, btn1_long_press_start_handler);
    button_attach(&btn1, BTN_LONG_PRESS_HOLD, btn1_long_press_hold_handler);
    button_attach(&btn1, BTN_PRESS_REPEAT, btn1_press_repeat_handler);

    // 初始化按键2（模拟为高电平有效）
    button_init(&btn2, read_button_gpio, 1, 2);

    // 绑定按键2的事件处理函数
    button_attach(&btn2, BTN_SINGLE_CLICK, btn2_single_click_handler);
    button_attach(&btn2, BTN_DOUBLE_CLICK, btn2_double_click_handler);
    button_attach(&btn2, BTN_PRESS_DOWN, btn2_press_down_handler);
    button_attach(&btn2, BTN_PRESS_UP, btn2_press_up_handler);

    // 启动按键处理
    button_start(&btn1);
    button_start(&btn2);
}

// 按键模拟按下，用于演示
void simulate_button_press(int button_id, int duration_ms)
{
    printf("\n📱 模拟按键%d按下，持续%d毫秒...\n", button_id, duration_ms);

    // if (button_id == 1) {
    //     btn1_state = 1;
    // } else if (button_id == 2) {
    //     btn2_state = 1;
    // }

    // 让按键库处理按下过程
    for (int i = 0; i < duration_ms / 5; i++) {
        button_ticks();
        usleep(5000); // 5ms延时
    }

    // 松开按键
    if (button_id == 1) {
        btn1_state = 0;
    } else if (button_id == 2) {
        btn2_state = 0;
    }

    // 处理松开后的消抖
    for (int i = 0; i < 10; i++) {
        button_ticks();
        usleep(5000); // 5ms延时
    }
}

// 主函数
int main(void)
{
    printf("🚀 MultiButton库基础示例\n");
    printf("=====================================\n\n");

    // 设置信号处理
    signal(SIGINT, signal_handler);

    // 初始化按键
    buttons_init();
    printf("✅ 按键初始化成功\n\n");

    printf("📋 演示流程：\n");
    printf("1. 单击演示\n");
    printf("2. 双击演示\n");
    printf("3. 长按演示\n");
    printf("4. 连发演示\n\n");

    // 演示流程
    printf("--- 单击演示 ---\n");
    simulate_button_press(1, 100);  // 短按
    usleep(500000); // 等待500ms

    printf("\n--- 双击演示 ---\n");
    simulate_button_press(1, 100);  // 第一次点击
    usleep(50000);  // 快速间隔
    simulate_button_press(1, 100);  // 第二次点击
    usleep(500000); // 等待超时

    printf("\n--- 长按演示 ---\n");
    simulate_button_press(1, 1500); // 长按
    usleep(200000); // 等待

    printf("\n--- 连发演示 ---\n");
    for (int i = 0; i < 3; i++) {
        simulate_button_press(2, 80);
        usleep(80000); // 快速连续
    }
    usleep(500000); // 等待超时

    printf("\n--- 按键状态查询演示 ---\n");
    printf("按键1是否按下：%s\n", button_is_pressed(&btn1) ? "是" : "否");
    printf("按键2是否按下：%s\n", button_is_pressed(&btn2) ? "是" : "否");
    printf("按键1连发计数：%d\n", button_get_repeat_count(&btn1));
    printf("按键2连发计数：%d\n", button_get_repeat_count(&btn2));

    printf("\n✅ 演示完成！\n");
    printf("💡 在实际应用中，button_ticks() 应由5ms定时中断调用。\n");

    return 0;
}

